import type {
  AxiosError,
  AxiosResponse,
  InternalAxiosRequestConfig,
} from 'axios';
import axios from 'axios';
import { showToast } from 'vant';

import { EnumStatusCode } from '@shared/constant/enum';

import router from '../router';
import { useUserStore } from '../stores/user';

// 创建axios实例
const request = axios.create({
  baseURL: '/api/v1',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器
request.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 从pinia store获取token
    const userStore = useUserStore()
    const token = userStore.token

    console.log("请求配置:", {
      url: config.url,
      baseURL: config.baseURL,
      fullUrl: `${config.baseURL}${config.url}`,
      token: token ? `${token.substring(0, 10)}...` : 'null'
    })

    if (token && config.headers) {
      config.headers['Authorization'] = `Bearer ${token}`
    }
    return config
  },
  (error: AxiosError) => {
    console.error('请求错误', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  (response: AxiosResponse) => {
    const data = response.data
    
    // 检查响应是否成功
    // 后端可能会返回 { code: 0, data: {...}, message: "成功" } 格式
    // 或者直接返回数据对象

    if (data.code === 0 || data.code === EnumStatusCode.SUCCESS || data.code === EnumStatusCode.CREATED || !data.code) {
      return data
    }
    // 处理业务错误 - BAD_REQUEST 等错误状态码应该被rejected
    showToast(data.message || '操作失败')
    return Promise.reject(new Error(data.message || '操作失败'))
  },
  (error: AxiosError) => {
    // 网络错误
    if (!error.response) {
      showToast('网络连接失败')
      return Promise.reject(new Error('网络连接失败'))
    }
    
    // 请求错误处理
    const status = error.response.status
    const responseData = error.response.data as any
    let message = responseData?.message || '请求失败' // 优先使用后端返回的错误信息
    
    console.log("httpRequest status",status)
    console.log("httpRequest responseData",responseData)
    
    // 如果后端没有返回具体错误信息，则使用默认信息
    if (!responseData?.message) {
      switch (status) {
        case EnumStatusCode.BAD_REQUEST:
          message = '请求参数错误'
          break
        case EnumStatusCode.UNAUTHORIZED:
          message = '登录已过期，请重新登录'
          // 清除认证状态
          const userStore = useUserStore()
          userStore.clearAuth()
          
          // 重定向到登录页面
          setTimeout(() => {
            if (router.currentRoute.value.path !== '/login') {
              router.replace('/login')
            }
          }, 100)
          break
        case EnumStatusCode.FORBIDDEN:
          message = '没有操作权限'
          break
        case EnumStatusCode.NOT_FOUND:
          message = '请求资源不存在'
          break
        case EnumStatusCode.INTERNAL_SERVER_ERROR:
          message = '服务器内部错误'
          break
        default:
          message = `请求失败(${status})`
      }
    } else {
      // 如果是401错误，仍然需要处理登录状态
      if (status === EnumStatusCode.UNAUTHORIZED) {
        const userStore = useUserStore()
        userStore.clearAuth()
        
        setTimeout(() => {
          if (router.currentRoute.value.path !== '/login') {
            router.replace('/login')
          }
        }, 100)
      }
    }
    
    // 显示错误提示
    showToast(message)
    
    return Promise.reject(new Error(message))
  }
)

export default request
